﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using SOAPIncidente.Dominio;
using SOAPIncidente.Persistencia;
using System.Messaging;

namespace SOAPIncidente
{
    public class Incidentes : IIncidentes
    {
        private IncidenteDAO incidenteDAO = null;
        private IncidenteDAO IncidenteDAO
        {
            get
            {
                if (incidenteDAO == null)
                    incidenteDAO = new IncidenteDAO();
                return incidenteDAO;
            }
        }

        public Incidente CrearIncidente(int cliente, int servicio, string tipo, string estado, int tecnico,
            DateTime fechaTicket, DateTime fechaCierre, string solucion, string descripcion, string evaluacion, string comentarioSolucion)
        {
            Incidente incidente = new Incidente()
            {
                Cliente = cliente,
                Servicio = servicio,
                Tipo = tipo,
                Estado = estado,
                Tecnico = tecnico,
                FechaTicket = fechaTicket,
                FechaCierre = fechaCierre,
                Solucion = solucion,
                Descripcion = descripcion,
                Evaluacion = evaluacion,
                ComentarioSolucion = comentarioSolucion
            };
            return IncidenteDAO.Crear(incidente);
        }

        public Incidente ObtenerIncidente(int nroTicket)
        {
            return IncidenteDAO.Obtener(nroTicket);
        }

        public Incidente ModificarIncidente(int nroTicket, int cliente, int servicio, string tipo, string estado, int tecnico,
            DateTime fechaTicket, DateTime fechaCierre, string solucion, string descripcion, string evaluacion, string comentarioSolucion)
        {
            Incidente incidente = new Incidente()
            {
                NroTicket = nroTicket,
                Cliente = cliente,
                Servicio = servicio,
                Tipo = tipo,
                Estado = estado,
                Tecnico = tecnico,
                FechaTicket = fechaTicket,
                FechaCierre = fechaCierre,
                Solucion = solucion,
                Descripcion = descripcion,
                Evaluacion = evaluacion,
                ComentarioSolucion = comentarioSolucion
            };
            return IncidenteDAO.Modificar(incidente);
        }

        public void EliminarIncidente(int nroTicket)
        {
            Incidente incidente = IncidenteDAO.Obtener(nroTicket);
            IncidenteDAO.Eliminar(incidente);
        }

        public List<Incidente> ListarIncidente()
        {
            return IncidenteDAO.ListarTodos().ToList();
        }


        public void CrearIncidenteEnCola(int cliente, int servicio, string tipo, string estado, int tecnico, DateTime fechaTicket, DateTime fechaCierre, string solucion, string descripcion, string evaluacion, string comentarioSolucion)
        {

            string rutaCola = @".\private$\Incidentes";
            if (!MessageQueue.Exists(rutaCola))
                MessageQueue.Create(rutaCola);
            MessageQueue cola = new MessageQueue(rutaCola);
            Message mensaje = new Message();
            mensaje.Label = "Nuevo Incidente";
            mensaje.Body = new Incidente()
            {
                Cliente = cliente,
                Servicio = servicio,
                Tipo = tipo,
                Estado = estado,
                Tecnico = tecnico,
                FechaTicket = fechaTicket,
                FechaCierre = fechaCierre,
                Solucion = solucion,
                Descripcion = descripcion,
                Evaluacion = evaluacion,
                ComentarioSolucion = comentarioSolucion
            };

            cola.Send(mensaje);



        }

        public int ObtenerCantidadColas()
        {

            string rutaCola = @".\private$\Incidentes";

            if (!MessageQueue.Exists(rutaCola))
                MessageQueue.Create(rutaCola);

            MessageQueue cola = new MessageQueue(rutaCola);
            cola.Formatter = new XmlMessageFormatter(new Type[] { typeof(Incidente) });

            return cola.GetAllMessages().Count();


        }

        public void DespacharColas()
        {

            string rutaCola = @".\private$\Incidentes";

            if (!MessageQueue.Exists(rutaCola))
                MessageQueue.Create(rutaCola);

            MessageQueue cola = new MessageQueue(rutaCola);
            cola.Formatter = new XmlMessageFormatter(new Type[] { typeof(Incidente) });

            for (int i = 0; i < cola.GetAllMessages().Count(); i++)
            {
                Message mensaje = cola.Receive();
                Incidente incidente = (Incidente)mensaje.Body;

                IncidenteDAO.Crear(incidente);

            }


        }
 
    }
}
